package control

import (
	"io"
	"mvip-route/beans"
	_const "mvip-route/const"
	"mvip-route/service/damRed/impl"
	"mvip-route/service/model"
	"mvip-route/utils"
	"net/http"
	"net/url"
	"os"

	"github.com/gin-gonic/gin"
)

type Forward struct {
}

// ForwardPage 转发到页面  这里请求到的是target中地址 http://ww.localhost.com/page?idcard=10004
func (f Forward) ForwardPage(c *gin.Context) {

	// 获取原始查询参数
	queryParam := c.Request.URL.Query()
	clientIP := c.ClientIP()
	request := c.Request
	domain := utils.GetFullDomain(c)
	service := impl.DamRedService{}
	platForm := service.GetPlatForm(domain)
	queryParamTarget := queryParam.Get(_const.RedirectParam)
	if queryParamTarget == "" {
		// 访问的是根域名 估计是有人在搞事情了；记录日志 提示404
		utils.LogAsync("访问/page，没带参数，搞事情", clientIP, platForm, request)
		c.AbortWithStatus(http.StatusForbidden)
		return
	}

	// 1. 判断是否是来自微信的请求
	userAgent := c.GetHeader("User-Agent")
	var isWeChatBrowser = utils.Wechat(userAgent)
	if isWeChatBrowser {
		// 如果是微信环境 说明是恶意进入链接；记录日志

		encode := queryParam.Encode()
		//email := config.Config.ServerConfig.Email
		//Icp := config.Config.ServerConfig.Icp
		beans.JumpPage{}.JumpPageForward(c, isWeChatBrowser, encode)
		return
	}

	// 2. 如果不是微信环境了 则都不需要sld  和 target了 在获取到target 之后  构建新的参数地址 把旧参数都删除
	targetUrl := queryParamTarget
	targetURL, err := url.Parse(targetUrl)
	if err != nil {
		beans.Fail(c, "target 地址不合法")
		return
	}
	// 查询参数 删除 target 参数以避免重复
	queryParam.Del(_const.RedirectParam)
	queryParam.Del("sld")

	// 获取目标地址中的查询参数
	targetParam := targetURL.Query()

	// 遍历多值参数并添加
	for key, values := range queryParam {
		for _, value := range values {
			targetParam.Add(key, value)
		}
	}

	targetURL.RawQuery = targetParam.Encode()

	println(targetURL.String())

	//target := c.Request.URL
	beans.JumpPage{}.JumpPage(c, targetURL.String())
}

// DownPage 下载文件
func (f Forward) DownPage(c *gin.Context) {
	// 获取参数
	query := c.Request.URL.Query()
	sld := query.Get("sld")
	var param = model.DamRedForm{}
	param.Sld = sld
	param.State = _const.StateOpen
	service := impl.DamRedService{}
	Ram, ramRedErr := service.SelectDamRedBySLD(param)
	if ramRedErr != nil {
		c.String(http.StatusInternalServerError, "ramRedErr: %v", ramRedErr)
		return
	}

	userAgent := c.GetHeader("User-Agent")
	var isWeChatBrowser = utils.Wechat(userAgent)
	if !isWeChatBrowser {
		// 2. 不是微信环境 再次重定向 携带参数
		t := Ram.Target

		Target, err := url.Parse(t)
		if err != nil {
			beans.Fail(c, "二次跳转 target 地址不合法")
			return
		}
		TargetParam := Target.Query()
		TargetParam.Del(_const.RedirectParam)
		// 得到请求参数
		encode := query.Encode()
		beans.JumpPage{}.JumpPage(c, t+"?"+encode)
		return
	}
	filePath := "./static/d"
	file, err := os.Open(filePath)
	if err != nil {
		c.String(http.StatusInternalServerError, "Failed to open file: %v", err)
		return
	}
	defer file.Close()

	// 设置响应头
	c.Header("Content-Description", "File Transfer")
	c.Header("Content-Transfer-Encoding", "binary")
	//todo 目前只有 pdf xlsx docx 可以吗
	c.Header("Content-Disposition", "attachment; filename=d.docx")
	c.Header("Content-Type", "application/octet-stream")
	// 流式传输文件
	if _, err := io.Copy(c.Writer, file); err != nil {
		c.String(http.StatusInternalServerError, "Failed to stream file: %v", err)
		return
	}
}

func (f Forward) ToCps(c *gin.Context) {

	// 获取原始查询参数
	queryParam := c.Request.URL.Query()
	clientIP := c.ClientIP()
	request := c.Request
	domain := utils.GetFullDomain(c)
	service := impl.DamRedService{}
	platForm := service.GetPlatForm(domain)

	userId := queryParam.Get(_const.UserID)
	if userId == "" {
		// 访问的是根域名 估计是有人在搞事情了；记录日志 提示404
		utils.LogAsync("访问/cps，没带参数，搞事情", clientIP, platForm, request)
		c.AbortWithStatus(http.StatusForbidden)
		return
	}

	encode := ""

	// 1. 判断是否是来自微信的请求
	userAgent := c.GetHeader("User-Agent")
	var isWeChatBrowser = utils.Wechat(userAgent)
	if isWeChatBrowser {
		// 如果是微信环境 说明是恶意进入链接；记录日志
		encode = queryParam.Encode()
	}

	beans.JumpPage{}.JumpPageCpsForward(c, isWeChatBrowser, encode)
	return
}
